package com.test.asmtest;

import java.net.SocketTimeoutException;
import java.util.Stack;

/**
 * created by lpw
 * on 2020/6/1
 */
public class TestClass {
    public static void main(String[] args) {
        Node node = createLinked(10);
//        logNode(node);
        Node deletNode = deleteLastNode(node, 6);
        logNode(deletNode);


    }

    //打印链表
    public static void logNode(Node node) {
        Node temp = node;
        while (temp != null) {
            System.out.println(temp.data);
            temp = temp.next;
        }
    }

    //生成链表
    public static Node createLinked(int len) {
        Node node = new Node();
        Node tempNode = node;
        for (int i = 0; i < len; i++) {
            char c = (char) (65 + i);
            tempNode.data = String.valueOf(c);
            if (i != len - 1) {
                tempNode.next = new Node();
                tempNode = tempNode.next;
            }
        }
        return node;
    }

    /**
     * 删除倒数第几个节点
     */
    public static Node deleteLastNode(Node node, int lastPos) {
        if (node == null) return null;
        int index = 1;//计数用的，从1开始数
        Node pre = null;//要删除点的上一个
        Node cur = node;//要删除的点
        Node nowNode = node;//用于迭代
        //删除倒数第n个，应该是正数的（m-n+1）个
        while (nowNode != null) {

            if (index > lastPos) {
                pre=cur;
                cur=cur.next;
            }
            nowNode = nowNode.next;
            index++;
        }
        //当要删除的到数第几个节点正好等于链表的长度时，其实是删除第一个节点
        if (index-1==lastPos){
            return node.next;
        }
        //当要删除的点的下一个节点是null，说明其实要删除的就是最后一个节点
        if (cur.next==null){
            pre.next=null;
        }
        //pre!=null说明要删除的节点在链表中间，正常删除就行
        if (pre!=null){
            pre.next=cur.next;
        }
        return node;
    }

    /**
     * 删除指定位置的节点，三种情况
     * 1、删第一个节点
     * 2、要删除的节点不大于所有的链表节点
     * 3、要删除的节点大于链表节点
     */

    public static Node deleteNode(Node node, int pos) {
        if (node == null) return null;
        Node pre = node;
        Node cur = node.next;
        if (pos == 1) return cur;
        int count = 2;
        while (cur != null) {
            if (count == pos) {
                pre.next = cur.next;
                break;
            }
            count++;
            pre = pre.next;
            cur = cur.next;
        }
        return node;
    }

}

class Node {
    String data;
    Node next;

}